Q7. 次のファイルはあるメッセージが暗号化されたものです。ASCIIコードの文字一つ一つを5乗して437で割った余りを10進数で記述しています。各十進数を何乗かして437で割った余りをASCIIコードとして解釈するとメッセージが読めますが、解読しようとしています
from 第44回 シェル芸勉強会振り返り 問題と解答
#Q&A #awk #bash
次のファイルはあるメッセージが暗号化されたものです。ASCIIコードの文字一つ一つを5乗して437で割った余りを10進数で記述しています。各十進数を何乗かして437で割った余りをASCIIコードとして解釈するとメッセージが読めますが、解読しようとしています
code:bash
$ cat message
262 325 122 80 266 406 163 89 325 89 326
小問1
まず、各数字を200乗して437で割った余りを出力してください。正解はこうなります。
35 308 26 282 399 87 349 55 308 55 85
opy使っていけた
code:first.sh
opy '[x ** 200 % 437 for x in F1:]' message
35 308 26 282 399 87 349 55 308 55 85
小問2
指数乗する数を変えて力づくで暗号を解いてください。
せっかくなのでopyを使って解いた
リスト内包表記がやはり超強力
code:second.sh
for i in {1..200}; do opy -v i=$i '[x ** i % 437 for x in F1:]' message | awk '{for (i=1; i<=NF; i++) {if (127<$i) exit(0)} print}' | opy '["".join([chr(x) for x in F1:])]'; done | grep unko
たぶんうんこかunkoが入ってるんだろうなぁと思ったら入っていたいみたい
ASCIIコードなので127以上の数値は除外できる、というのは思いつかなかった
ただforでループしてみたら特に実感したが、やはり内部でeval的なものを使用している影響か、かなり処理速度が遅い
小問3
もっと合理的に解いてください。
127以上を除外する、というのが合理的解法なのかな、たぶん